package com.zsz.controller;

import com.zsz.vo.Student;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.servlet.ModelAndView;

/**
 *  @Controller:创建处理器对象，对象放在springmvc容器中。
 *  value:所有请求地址的公共部分，叫做模块名称
 *  位置：在类的上面
 *  和Spring中讲的@Service ,@Component
 *
 *  能处理请求的都是控制器（处理器）： MyController能处理请求，
 *                         叫做后端控制器（back controller）
 *
 *  没有注解之前，需要实现各种不同的接口才能做控制器使用
 */
@Controller
public class MyController {
    /**
     * 逐个接受请求参数：
     * 要求：处理器（控制器）方法的形参名和请求中参数名必修一致。
     *      同名的请求参数赋值给同名的形参
     *
     *  框架接受请求参数
     *  1.使用request对象接受请求参数
     *    String strName=request.getParamter("name");
     *    String strAge=request.getParamter("age");
     *  2.springmvc框架通过DispatcherServlet调用MyController的doSome（）方法
     *    调用方法时，按名称对应，把接受的参数赋值给形参
     *    doSome（strName，Integer.valueOf(strAge)）;
     *    框架会提供类型的转换功能，能把String转为int，long，float，double等类型。
     *
     *
     * @return
     */

    @RequestMapping(value = "/receiveproperty.do")
    public ModelAndView doSome(String name,Integer age){  // doGet()--service请求处理
        //可以直接在方法中使用name，age
        //处理some.do请求了。 相当于service调用处理完成了。

        ModelAndView mv  = new ModelAndView();
        mv.addObject("myname",name);
        mv.addObject("myage",age);
        mv.setViewName("show");
        return mv;
    }


    /**
     * 请求中参数名和处理器方法的参数名不一样
     * @RequestParam:逐个接收请求参数中，解决请求中参数名和形参名不一样的问题
     *    属性：1.value 请求中的参数名称
     *         2.required是一个boolean，默认就是true
     *           true：表示请求中必须包含此参数。
     *    位置：在处理器方法的形参定义的前面
     */

    @RequestMapping(value = "/receiveparam.do")
    public ModelAndView receiveParam(@RequestParam(value = "rname") String name,
                                     @RequestParam(value = "rage") Integer age){  // doGet()--service请求处理
        //可以直接在方法中使用name，age
        //处理some.do请求了。 相当于service调用处理完成了。

        ModelAndView mv  = new ModelAndView();
        mv.addObject("myname",name);
        mv.addObject("myage",age);
        mv.setViewName("show");
        return mv;
    }


    /**
     * 处理器方法形参是java对象，这个对象的属性名和请求中参数名是一样的
     * 框架会创建形参的java对象，给属性赋值。请求中的参数名是name，框架会调用setName()
     * @return
     */
    @RequestMapping(value = "/receiveobject.do")
    public ModelAndView receiveObject(Student myStudent){  // doGet()--service请求处理
        System.out.println("receiveObject,name="+myStudent.getName()+"age="+myStudent.getAge());
        //可以直接在方法中使用name，age
        //处理some.do请求了。 相当于service调用处理完成了。

        ModelAndView mv  = new ModelAndView();
        mv.addObject("myname",myStudent.getName());
        mv.addObject("myage",myStudent.getAge());
        mv.addObject("mystudent",myStudent);
        mv.setViewName("show");
        return mv;
    }



}
